package org.aurora.module.user.domain.entity;

import lombok.*;
import org.aurora.framework.boot.domain.AbstractDomainObject;
import org.aurora.framework.boot.domain.AggregateRoot;

import java.io.Serial;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * User
 * <pre>
 * description: 用户聚合根
 * create date: 2025-03-21 23:03:29
 * </pre>
 *
 * @author cao.yong
 */
@Getter
@Setter
@NoArgsConstructor
@ToString
public class User extends AbstractDomainObject<Long> implements AggregateRoot<Long> {
    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * 用户ID
     */
    private Long id;
    /**
     * 用户登录名
     */
    private String username;
    /**
     * 用户密码
     */
    private String password;
    /**
     * 用户状态
     */
    private Integer state;
    /**
     * 用户头像
     */
    private String avatar;
    /**
     * 用户昵称
     */
    private String nickName;
    /**
     * 真实姓名
     */
    private String realName;
    /**
     * 性别
     */
    private Integer sex;
    /**
     * 民族
     */
    private Integer ethnicity;
    /**
     * 国籍
     */
    private Integer nationality;
    /**
     * 身份证号
     */
    private String idCard;
    /**
     * 出生日期
     */
    private LocalDate birthDate;
    /**
     * 手机号码
     */
    private String telephone;
    /**
     * 用户邮箱
     */
    private String email;
    /**
     * 最后登录时间
     */
    private LocalDateTime lastLoginTime;
    /**
     * 创建时间
     */
    private LocalDateTime createTime;
    /**
     * 最后修改时间
     */
    private LocalDateTime lastModifiedTime;
    /**
     * 租户ID
     */
    private Long tenantId;
    /**
     * 删除标志
     */
    private Integer deleted;

    /**
     * 用户角色列表
     */
    List<Role> roles;

    void assignRole(Role role) {
        if (Objects.isNull(roles)) {
            roles = List.of(role);
        } else {
            boolean matched = roles.stream().anyMatch(r -> r.equals(role));
            if (!matched) {
                roles.add(role);
            }
        }
    }

    void revokeRole(Role role) {
        if (Objects.isNull(roles)) { return; }
        boolean matched = roles.stream().anyMatch(r -> r.equals(role));
        if (matched) {
            roles.remove(role);
        }
    }
}
